/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
package jp.ize.ux.components;

// {{{ imports
import jp.ize.ux.UXObject;
import jp.ize.ux.UXController;
import jp.ize.ux.geom.UXPoint;
import jp.ize.ux.states.UXEllipseState;
import jp.ize.ux.UXInteraction;
import jp.ize.ux.acts.Act;
import jp.ize.ux.acts.EllipseAct;
import flash.events.Event;
import flash.events.MouseEvent;
import jp.ize.ux.tween.easings.Expo;
// }}}
// {{{ class UXEllipseBoxCoState
class UXEllipseBoxCoState
{
	// {{{ public var focused(default, default) : Bool
	/**
	 * フォーカスが当たっているかどうかを取得、または設定します。
	 */
	public var focused(default, default) : Bool;
	// }}}
	// {{{ public var highlighted(default, default) : Bool
	/**
	 * ハイライトされているかどうかを取得、または設定します。
	 */
	public var highlighted(default, default) : Bool;
	// }}}
}
// }}}
// {{{ enum UXEllipseBoxExclusiveState
/**
 * UXEllipseBoxの各種状況を表現します。
 */
enum UXEllipseBoxExclusiveState
{
	/** 初期化状態にある事を意味します。*/
	INIT;
	/** 無効になっている事を意味します。*/
	DISABLE;
	/** 有効になっている事を意味します。パラメーターでは、フォーカスやハイライトの状況を保持します。*/
	ENABLE ( flags : UXEllipseBoxCoState );
}
// }}}
// {{{ class UXEllipseBoxState extends UXEllipseState
class UXEllipseBoxState extends UXEllipseState
{
	// {{{ public function new( center:UXPoint, radiusx:Float, radiusy:Float, s:Float, e:Float )
	/**
	 * コンストラクタです。
	 *
	 * @param center: 中心座標です。
	 * @param radiusx: x軸方向の半径です。
	 * @param radiusy: y軸方向の半径です。
	 * @param s: 開始角です。
	 * @param e: 終了角です。
	 */
	public function new( center:UXPoint, radiusx:Float, radiusy:Float, s:Float, e:Float )
	{
		super( center, radiusx, radiusy, s, e );
		thetas = new Array();
	}
	// }}}
	// {{{ public var background(default, default) : UXObject
	/**
	 * 背景となるオブジェクトです。デフォルトはnullです。
	 */
	public var background(default, default) : UXObject;
	// }}}
	// {{{ public var condition( default, default) : UXEllipseBoxExclusiveState;
	/**
	 * enableかどうかやフォーカスが当たっているかなど各種状況を保持する変数です。
	 */
	public var condition( default, default) : UXEllipseBoxExclusiveState;
	// }}}
	// {{{ public var thetas( default, default) : Array<Float>;
	/**
	 * 子要素ごとの現在の角度をラジアン単位で示します。
	 */
	public var thetas( default, default) : Array<Float>;
	// }}}
}
// }}}

// {{{ class UXEllipseBox extends UXComponent
/**
 * UXEllipseBoxクラス.<br>
 * Ellipseレイアウトと背景を持つコンポーネントです。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id$<br>
 */
class UXEllipseBox extends UXComponent<UXEllipseBoxState>
{
	// {{{ public function new( rx:Float, ry:Float, s:Float, e:Float )
	/**
	 * コンストラクタです。
	 *
	 * @param rx: x軸方向の半径です。
	 * @param ry: y軸方向の半径です。
	 * @param s: 開始角です。0から360の間の値です。
	 * @param e: 終了角です。0から360の間の値です。
	 */
	public function new( rx:Float, ry:Float, s:Float, e:Float )
	{
		state = new UXEllipseBoxState( new UXPoint(0,0), rx, ry, s, e );
		state.target = this;
		state.cyclic = true;
		ctrl = new UXController<UXEllipseBoxState>( state );
		super( ctrl );
	}
	// }}}
	// {{{ public function setBackground( back : UXObject ) : Void
	/**
	 * 背景となるオブジェクトを設定できます。
	 */
	public function setBackground( back : UXObject ) : Void
	{
	}
	// }}}
	// {{{ public function addUXChild( c : UXObject ) : Void
	/**
	 * addChild オーバーライドメソッドです。引数として受け取った子オブジェクトを追加し、
	 * このコンポーネントの状態やコントーラーに反映させます。
	 */
	public override function addUXChild( c : UXObject ) : Void
	{
		super.addUXChild( c );
		state.children.push( c );
		state.thetas.push( 0 );
	}
	// }}}
	// {{{ public function removeUXChild( c : UXObject ) : Void
	/**
	 * removeChild オーバーライドメソッドです。引数として受け取った子オブジェクトを削除し、
	 * このコンポーネントの状態やコントローラーに反映させます。
	 */
	public override function removeUXChild( c : UXObject ) : Void
	{
		super.removeUXChild(c);
	}
	// }}}
	// {{{ public function update( updator : UXEllipseBoxState -> Void ) : Void
	/**
	 * このコンポーネントの状態を直接変更するメソッドです。状態のどんな操作も可能になるので、
	 * このメソッドの使用には注意が必要です。
	 */
	public function update( updator : UXEllipseBoxState -> Void ) : Void
	{
		updator( state );
	}
	// }}}
}
// }}}

// {{{ class UXEllipseRotateInteraction extends UXInteraction<UXEllipseBoxState>
/**
 * UXRotateInteraction クラス<br>
 * Ellipseの回転を表すインタラクションクラスです。
 */
class UXEllipseRotateInteraction extends UXInteraction<UXEllipseBoxState>
{
	// {{{ public function new( d:Int )
	/**
	 * コンストラクタです。
	 */
	public function new( d:Int )
	{
		super();
		name = "Rotate";
		//実装例
		judge = function (s) return true;
		var actparam:MoveParameter = {
			time:0.3,
			transition:Expo.easeOut,
			delta:d
		};
		addAct( (new EllipseAct()).move(actparam) );
	}
	// }}}
}
// }}}
